package com.youdianda.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youdianda.constant.MessageConstant;
import com.youdianda.dto.TagQueryPageDTO;
import com.youdianda.entity.YddArticle;
import com.youdianda.entity.YddCate;
import com.youdianda.entity.YddTag;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youdianda.mapper.YddTagMapper;
import com.youdianda.result.Result;
import com.youdianda.service.IYddArticleService;
import com.youdianda.service.IYddTagService;

import com.youdianda.vo.TagQueryPageVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author mosen
 * @since 2023-05-15
 */
@Service
public class YddTagServiceImpl extends ServiceImpl<YddTagMapper, YddTag> implements IYddTagService {

    @Autowired
    private IYddArticleService yddArticleService;

    /**
     * 查询所有标签
     *
     * @param
     * @return
     */
    @Override
    public Result<List<YddTag>> tagAll() {

        List<YddTag> tagAll = this.list();

        return Result.success(tagAll);

    }

    /**
     * 根据id删除标签
     *
     * @param id
     * @return
     */
    @Transactional
    @Override
    public Result<YddTag> delTag(String id) {
        this.removeById(id);

        return Result.success();
    }

    /**
     * 修改标签
     *
     * @param yddTag
     * @return
     */
    @Transactional
    @Override
    public Result<YddTag> updateTag(YddTag yddTag) {
        //1.判断标签名是否唯一
        LambdaQueryWrapper<YddTag> query = new LambdaQueryWrapper<>();
        query.eq(YddTag::getTagname, yddTag.getTagname()).ne(YddTag::getId, yddTag.getId());
        long count = this.count(query);
        // 2.如果已经存在,异常处理
        if (count > 0) {
            return Result.error(MessageConstant.UPDATE_TAGNAME_NOT_ALREADY_EXISTS);
        }
        //3.唯一则更新数据库
        this.updateById(yddTag);
        return Result.success();
    }

    /**
     * 根据标签id查询
     *
     * @param id
     * @return
     */
    @Override
    public Result<YddTag> TagById(String id) {
        YddTag yddCate = this.getById(id);
        return Result.success(yddCate);
    }

    /**
     * 添加标签
     *
     * @param tag
     * @return
     */
    @Transactional
    @Override
    public Result<YddTag> addTag(YddTag tag) {
        //1.判断标签名是否唯一
        LambdaQueryWrapper<YddTag> query = new LambdaQueryWrapper<>();
        query.eq(YddTag::getTagname, tag.getTagname());
        long count = this.count(query);
        // 2.如果已经存在,异常处理
        if (count > 0) {
            return Result.error(MessageConstant.ADD_TAGNAME_NOT_ALREADY_EXISTS);
        }
        //3.唯一则更新数据库
        this.save(tag);
        return Result.success();
    }

    /**
     * 标签分页查询
     *
     * @param tagQueryPageDTO
     * @return
     */
    @Override
    public Result<TagQueryPageVo> TagPage(TagQueryPageDTO tagQueryPageDTO) {
        //1.设置分页参数
        Page<YddTag> page = new Page<>(tagQueryPageDTO.getPage(), tagQueryPageDTO.getLimit());

        //2.用mp模糊查询
        LambdaQueryWrapper<YddTag> tagPage = new LambdaQueryWrapper<>();
        tagPage.like(tagQueryPageDTO.getTagname() != null, YddTag::getTagname, tagQueryPageDTO.getTagname());

        //3.mp分页查询
        Page<YddTag> yddTagPage = this.page(page, tagPage);

        //4.封装vo
        TagQueryPageVo tagQueryPageVo = new TagQueryPageVo(tagQueryPageDTO.getPage(), tagQueryPageDTO.getLimit(), yddTagPage.getTotal(), yddTagPage.getPages(), yddTagPage.getRecords());

        return Result.success(tagQueryPageVo);
    }
}
